

package com.shihb {

  /**
   * 包对象
   */
  package object chapter03oop {
    def sayHi: Unit ={
      println("hi")
    }

  }

  package chapter03oop {

    /**
     * 可见性的介绍
     */
    object Demo04PageVisit {
      def main(args: Array[String]): Unit = {
        val clerk = new Clerk
        //    clerk.sal private 不能访问
        //    clerk.age 同包也不能访问protected
        clerk.high
        Clerk.show(clerk)
        sayHi

      }

    }


    class Clerk {
      // 加不加private底层都是私有的
      // 默认的会都会提供读方法name(),不提供修改name_$eq
      // 加了private不提供读写方法,对外不可见
      var name: String = "tom"
      private var sal: Double = 3.2
      protected var age: Int = 10
      // 增加包的访问权限
      // private[chapter03oop]
      // 1、仍然是private
      // 2、在chapter03oop(包括子包)下可见，相当于扩大了访问范围
      private[chapter03oop] var high: Double = 153.2

      def showInfo {
        println(s"name:$name,sal:$sal")
      }
    }

    /*
    class Clerk   伴生类
    object  Clerk 伴生对象
    为什么要分开写？
    因为scala设计者将static拿掉了,为了实现static的效果，设计了伴生类和伴生对象
    伴生类 写非静态内容
    伴生对象 写静态内容
     */
    object Clerk {
      def show(c: Clerk): Unit = {
        //伴生对象可以访问和修改私有属性
        c.sal = 100.11;
        c.age = 20
        println(s"name:${c.name},sal:${c.sal},age:${c.age}")
      }
    }

  }

}
